## 数组工具类
class_name ArrayUtility
extends Object

#region Copy
## 复制 Array 中的一系列元素（从指定的源索引开始），并将它们粘贴到另一 Array 中（从指定的目标索引开始）。
## 参数：
## source-包含要复制数据的数组。
## destination-接收数据的数组。
## source_index-source数组中复制开始处的索引。
## destination_index-destination数组中存储开始处的索引。
## length-要复制的元素数目。
## 备注：
## 本方法总是尝试复制尽可能多的元素，并且避免失败。
static func Copy(source: Array, destination: Array, source_index: int = 0, destination_index: int = 0, length: int = 0) -> void:
	# 检查参数
	if not source or source.is_empty():
		return
	if not destination or destination.is_empty():
		return
	var source_length: int = source.size()
	var destination_length: int = destination.size()
	if source_index >= source_length or destination_index >= destination_length:
		return
	if source_index < 0:
		source_index = 0
	if destination_index <0:
		destination_index = 0
	# 计算实际复制的元素数目
	var real_length: int = length
	var source_rest_length: int = source_length - source_index
	var destination_rest_length: int = destination_length - destination_index
	if length <= 0 or source_rest_length < length or destination_rest_length < length:
		real_length = mini(source_rest_length, destination_rest_length)
	# 复制
	for i: int in real_length:
		destination[ destination_index + i ] = source[ source_index + i ]
#endregion Copy
	
#region XOR
## 对数组执行异或操作
## 参数：
## buffer-缓冲区
## xorValue-异或值
## start-执行异或操作的起点
## count-执行异或操作的元素数目
static func XOR(buffer: PackedByteArray, xorValue: int, start: int = 0, count: int = 0) -> void:
	var length: int = buffer.size() if buffer else 0
	if length <= 0:
		return
	if start < 0:
		start = 0
	if count <= 0 or start + count > length:
		count = length - start
	for idx: int in range(start, start + count):
		buffer[idx] = buffer[idx] ^ xorValue
#endregion XOR

#region FindSubarray
## 在字节数组中查找子数组
## 参数：
## array-字节数组
## subarray-子数组
## 返回：子数组在数组中的位置。如果没有找到，返回-1。
static func FindSubarray(array: PackedByteArray, subarray: PackedByteArray) -> int:
	var array_size: int = array.size()
	var subarray_size: int = subarray.size()
	if subarray_size > array_size:
		return -1

	for i in range(array_size - subarray_size + 1):
		var isMatch: bool = true
		for j in range(subarray_size):
			if array[i + j] != subarray[j]:
				isMatch = false
				break
		if isMatch:
			return i

	return -1
#endregion FindSubarray

#region StartsWith
## 判断字节数组是否已另一个字节数组开始
## 参数：
## buffer-字节数组
## start-字节数组的开始
## 返回：字节数组是否已另一个字节数组开始。
static func StartsWith(buffer: PackedByteArray, start: PackedByteArray) -> bool:
	var bufferSize: int = buffer.size() if buffer else 0
	var startSize: int = start.size() if start else 0
	if bufferSize == 0 or startSize == 0:
		return false
	if bufferSize < startSize:
		return false
	return buffer.slice(0, startSize) == start
#endregion StartsWith
